/**
 * 根据给定比例和长度计算对应的另一边的长度
 *
 * @param {string} ratio - 比例，格式为 '宽度/高度' 或 '高度/宽度'
 * @param {number} length - 已知的长度（宽度或高度）
 * @param {string} lengthType - 已知长度的类型，'width' 表示已知的是宽度，'height' 表示已知的是高度
 * @returns {number} - 计算得到的另一边的长度
 */
export function calculateDimension(ratio, length, lengthType) {
  // 解析比例
  const [numerator, denominator] = ratio.split('/').map(Number)
  if (isNaN(numerator) || isNaN(denominator)) {
    throw new Error('无效的比率格式')
  }

  // 判断已知的长度是宽度还是高度
  if (lengthType === 'width') {
    // 已知宽度，求高度
    return (length * denominator) / numerator
  } else if (lengthType === 'height') {
    // 已知高度，求宽度
    return (length * numerator) / denominator
  } else {
    throw new Error('无效长度类型. 使用 "width" 或 "height".')
  }
}

/**
 * 判断视频是宽度填满容器还是高度填满容器
 *
 * @param {HTMLElement} element - 包含视频的 HTML 元素
 * @param {string} [videoAspectRatio='16/9'] - 视频的宽高比，格式为 '宽度/高度'
 * @returns {boolean} - 如果视频宽度填满了容器，返回 true；否则返回 false，表示高度填满
 */
export function isVideoWidthFull(element, videoAspectRatio = '16/9') {
  // 获取元素的宽高
  const rect = element.getBoundingClientRect()
  const elementWidth = rect.width
  const elementHeight = rect.height

  // 将比例字符串转换为数值比例
  const [widthRatio, heightRatio] = videoAspectRatio.split('/').map(Number)
  const videoRatio = widthRatio / heightRatio
  const elementAspectRatio = elementWidth / elementHeight

  // 判断视频是否宽度填满了容器
  if (elementAspectRatio > videoRatio) {
    return false // 高度填满
  } else {
    return true // 宽度填满
  }
}

/**
 * 将宽高转换为宽高比字符串
 *
 * @param {number} width 宽度
 * @param {number} height 高度
 * @returns {string} 宽高比字符串，例如 '16/9'
 */
export function calculateAspectRatio(width, height) {
  if (!width || !height) return '16/9' // 默认返回16:9

  const divisor = gcd(width, height)
  const ratioWidth = width / divisor
  const ratioHeight = height / divisor

  return `${ratioWidth}/${ratioHeight}`
}

/**
 * 计算两个数的最大公约数
 *
 * @param {number} a 第一个数
 * @param {number} b 第二个数
 * @returns {number} 最大公约数
 */
function gcd(a, b) {
  return b === 0 ? a : gcd(b, a % b)
}
